# config/parser.py
import argparse


def parse_args():
    """
    解析命令行参数，为整个项目提供统一的配置接口。
    """
    parser = argparse.ArgumentParser(
        description="Run CSE_KGAN: LLM-driven Dual Enhancement for KG-based Recommendation.")

    # --- 数据集相关参数 ---
    parser.add_argument('--data_name', type=str, default='amazon-book',
                        help='数据集名称 (例如: amazon-book, electronics)。')
    parser.add_argument('--data_dir', type=str, default='data/',
                        help='数据集所在的根目录。')

    # --- 模型结构相关参数 ---
    parser.add_argument('--embed_dim', type=int, default=64,
                        help='用户/物品/实体/关系的基础嵌入维度。')
    parser.add_argument('--conv_dim_list', type=str, default='[64, 32, 16]',
                        help='GNN每一层聚合后的输出维度列表 (JSON格式字符串)。')
    parser.add_argument('--mess_dropout', type=str, default='[0.1, 0.1, 0.1]',
                        help='GNN每层消息传播的dropout率列表 (JSON格式字符串)。')

    # --- 训练过程相关参数 ---
    parser.add_argument('--lr', type=float, default=0.0001,
                        help='学习率。')
    parser.add_argument('--cf_batch_size', type=int, default=4096,
                        help='协同过滤任务的批次大小。')
    parser.add_argument('--n_epoch', type=int, default=500,
                        help='最大训练轮数。')
    parser.add_argument('--stopping_steps', type=int, default=10,
                        help='早停的耐心步数 (连续N个评估周期性能无提升则停止)。')
    parser.add_argument('--clip_grad_norm', type=float, default=5.0,
                        help='梯度裁剪的阈值，设置为0表示不进行裁剪。')

    # --- 损失函数权重 ---
    parser.add_argument('--cf_l2loss_lambda', type=float, default=1e-5,
                        help='协同过滤任务中嵌入的L2正则化权重。')
    parser.add_argument('--contrastive_lambda', type=float, default=0.1,
                        help='对比损失 (用于对齐结构-语义视图) 的权重。')

    # --- 评估与日志 ---
    parser.add_argument('--evaluate_every', type=int, default=5,
                        help='每隔多少个epoch在验证集上评估一次。')
    parser.add_argument('--Ks', type=str, default='[20, 40]',
                        help='评估指标 Top-K 的 K 值列表 (JSON格式字符串)。')
    parser.add_argument('--save_dir', type=str, default='saved/',
                        help='模型检查点和日志的保存目录。')
    parser.add_argument('--valid_metric', type=str, default='Recall@20',
                        help='用于早停和选择最佳模型的验证指标 (例如: Recall@20, NDCG@20)。')

    # --- 系统与环境 ---
    parser.add_argument('--seed', type=int, default=2024,
                        help='随机种子，用于保证实验可复现性。')
    parser.add_argument('--gpu_id', type=int, default=0,
                        help='使用的GPU设备ID, -1表示使用CPU。')

    return parser.parse_args()
